package com.hy.medicine.Excel;

import com.alibaba.excel.context.AnalysisContext;
import org.apache.commons.lang3.StringUtils;

import java.lang.reflect.Field;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

/**
 * Excel数据校验处理器
 */
public class ExcelValidationHandler {

    /**
     * 校验Excel数据
     *
     * @param data Excel行数据对象
     * @param context EasyExcel上下文
     * @throws ExcelValidationException 校验异常
     */
    public static void validate(Object data, AnalysisContext context) throws ExcelValidationException {
        List<String> errors = new ArrayList<>();

        // 获取对象的所有字段
        Field[] fields = data.getClass().getDeclaredFields();
        for (Field field : fields) {
            field.setAccessible(true);
            // 检查是否有@ExcelRequired注解
            ExcelRequired required = field.getAnnotation(ExcelRequired.class);
            if (required != null) {
                try {
                    Object value = field.get(data);
                    // 根据字段类型进行校验
                    if (!isValidValue(value, field.getType())) {
                        errors.add(required.message());
                    }
                } catch (IllegalAccessException e) {
                    throw new RuntimeException("字段访问异常", e);
                }
            }
        }

        // 如果有错误，抛出异常
        if (!errors.isEmpty()) {
            throw new ExcelValidationException(
                String.format("第%d行数据校验失败：%s",
                context.readRowHolder().getRowIndex() + 1,
                String.join(", ", errors))
            );
        }
    }

    /**
     * 根据字段类型判断值是否有效
     *
     * @param value 字段值
     * @param fieldType 字段类型
     * @return 是否有效
     */
    private static boolean isValidValue(Object value, Class<?> fieldType) {
        if (value == null) {
            return false;
        }

        // 字符串类型特殊处理
        if (String.class.equals(fieldType)) {
            return StringUtils.isNotBlank((String) value);
        }

        // BigDecimal类型特殊处理
        if (BigDecimal.class.equals(fieldType)) {
            BigDecimal bdValue = (BigDecimal) value;
            return bdValue.compareTo(BigDecimal.ZERO) > 0;
        }

        // Integer类型特殊处理
        if (Integer.class.equals(fieldType)) {
            Integer intValue = (Integer) value;
            return intValue > 0;
        }

        // 其他类型，只要不为null就认为有效
        return true;
    }
}
